const express = require('express')
const app = express()
const session = require('express-session')
const _ = require('lodash')
// 文件数据库 版本太高不支持require
const lowdb = require('lowdb')
// 生成唯一id
const { v4: uuid } = require('uuid')
// 加密token，校验token时使用
const secretOrPrivateKey = "userLogin"  //加密token 校验token时要使用
// 生成token
const jsonwebtoken = require('jsonwebtoken')
// 解析验证token
const expressjwt = require('express-jwt')
// 有多种适配器可选择
const FileSync = require("lowdb/adapters/FileSync");
 // 申明一个user适配器
 const user = new FileSync('./db/user.json');
//   // 申明一个menu适配器
//  const menu = new FileSync('./db/menu.json');
 // 用户表
const db_user = lowdb(user);
// // 菜单表
// const db_menu = lowdb(menu);

// 将静态资源和api服务部署到一个服务器上，不存在跨域问题
app.use(express.static("./public"));

app.use(session({
  secret:'express_cookie',
  resave: true,
  saveUninitialized:true,
  //该插件用于给每次请求创建一个session-id用来装取数据的对象，并响应返回一个cookie对应的值session-id
  //并且将Set-Cookie的值设置为该session-id，下次请求时就会带上该cookie，并且用该cookie的session-id和内存中的session-id比对
  //如果存在表示登录过,否则没有登录过
  cookie: {maxAge: 60 * 1000 * 30}//过期时间
}));

app.use(function(req, res, next) {
  // 解决返回的汉字乱码的问题
  res.setHeader("Content-type","text/plain;charset=utf-8");
  // 允许所有源发送的请求，解决跨域问题
  res.setHeader('Access-Control-Allow-Origin', '*');
  next();
})
app.get('/login', (req, res, next) => {
  const { username, password } = req.query;
  const value = db_user.get('users').find({ username, password: Number(password) }).value()
  if (value) {
    res.statusCode = 200
    req.session.login = true;
    res.json({
      code: 200,
      msg: '登录成功！',
      data: { 
        token: jsonwebtoken.sign({
          name: username,
          data: "============="
        }, secretOrPrivateKey, {
          expiresIn: 60 * 1
        })
     }})
     next()
  } else {
    res.statusCode = 404
    res.end('用户名或密码错误！')
  }
})

//中间件的位置放在/login接口后，其他接口前的原因是：
//只有访问过/login接口，才将session的状态设置为true
//但是放在其他接口前面可以拦截没有登录就直接进入其他接口，

//拦截没有登录就访问其他接口的用户,在没有登录时就直接访问其他接口
app.use(function (req, res, next) {
  if (req.session.login) {
    next();
  } else {
    res.status(401);
  }
})

// 获取菜单列表
// app.get('/getMenuList', (req, res, next) => {
//   res.json(db_menu.get('menu').value())
//   next()
// })

app.listen(8000)
